home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Special 23 / AMIGAplus Sonderheft 23 (2000)(Falke)(DE)[!].iso / Tools / Packer / xad / Developer / Sources / clients / PackDev.c < prev    next >
C/C++ Source or Header  |  1999-11-06  |  4KB  |  147 lines

  1. #ifndef XADMASTER_PACKDEV_C
  2. #define XADMASTER_PACKDEV_C
  3.  
  4. /* Programmheader
  5.  
  6.     Name:        PackDev.c
  7.     Main:        xadmaster
  8.     Versionstring:    $VER: PackDev.c 1.0 (13.06.1998)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    PackDev disk archiver client
  12.  
  13.  1.0   13.06.98 : first version
  14. */
  15.  
  16. #include <proto/xadmaster.h>
  17. #include "SDI_compiler.h"
  18. #include "xpkstuff.c"
  19.  
  20. #ifndef XADMASTERFILE
  21. #define PackDev_Client        FirstClient
  22. #define NEXTCLIENT        0
  23. UBYTE version[] = "$VER: PackDev 1.0 (13.06.1998)";
  24. #endif
  25. #define PACKDEV_VERSION        1
  26. #define PACKDEV_REVISION    0
  27.  
  28. struct PackDevHead {
  29.   ULONG        pd_Header;    /* equals 'PKD\x13' */
  30.   ULONG        pd_BlockNum;    /* Number of blocks */
  31.   ULONG        pd_BlockSize;    /* size of one block */
  32.   ULONG        pd_Reserved;    /* Reserved blocks */
  33.   ULONG        pd_TrackLength;    /* Length of one track*/
  34.   ULONG        pd_xpkBufferSize; /* in byte */
  35.   ULONG        pd_xpkPacker;    /* XPK packer type */
  36.   ULONG pad1;
  37.   ULONG pad2;
  38.   ULONG pad3;
  39.   ULONG pad4;
  40.   ULONG pad5;
  41.   UWORD        pd_xpkMode;     /* XPK mode Number 0..100 */
  42.   UWORD        pd_KnownFileSys; /* When all data stored, this is 0, else 1 */
  43. };
  44.  
  45. ASM(BOOL) PackDev_RecogData(REG(d0, ULONG size), REG(a0, STRPTR data),
  46. REG(a6, struct xadMasterBase *xadMasterBase))
  47. {
  48.   if(((ULONG *)data)[0] == 0x504B4413)
  49.     return 1;
  50.   else
  51.     return 0;
  52. }
  53.  
  54. /* maybe there are some errors in that code, not tested yet */
  55. ASM(LONG) PackDev_GetInfo(REG(a0, struct xadArchiveInfo *ai),
  56. REG(a6, struct xadMasterBase *xadMasterBase))
  57. {
  58.   struct PackDevHead h;
  59.   LONG err;
  60.   struct ExecBase * SysBase = xadMasterBase->xmb_SysBase;
  61.  
  62.   if(!(err = xadHookAccess(XADAC_READ, sizeof(struct PackDevHead), &h, ai)))
  63.   {
  64.     struct xadDiskInfo *xdi;
  65.     ULONG blksiz = 0, i, dat[9];
  66.     STRPTR buf = 0;
  67.     
  68.     if(h.pd_KnownFileSys)
  69.     {
  70.       blksiz = h.pd_BlockNum;
  71.       if(h.pd_xpkPacker)
  72.         err = xpkDecrunch(&buf, &i, ai, xadMasterBase);
  73.       else
  74.       {
  75.         if(!(buf = (STRPTR) AllocVec((i = blksiz>>8), MEMF_ANY)))
  76.           err = XADERR_NOMEMORY;
  77.         else
  78.           err = xadHookAccess(XADAC_READ, i, buf, ai);
  79.       }
  80.     }
  81.  
  82.     /* check for password flag */
  83.     if(!err && !(err = xadHookAccess(XADAC_READ, 36, dat, ai)) &&
  84.     !(err = xadHookAccess(XADAC_INPUTSEEK, -36, 0, ai)))
  85.     {
  86.       if(dat[8] & (1<<25))
  87.         ai->xai_Flags |= XADAIF_CRYPTED;
  88.     }
  89.     
  90.     if(!err)
  91.     {
  92.       if((xdi = (struct xadDiskInfo *) xadAllocObject(XADOBJ_DISKINFO,
  93.       blksiz ? XAD_OBJBLOCKENTRIES : TAG_DONE, blksiz, TAG_DONE)))
  94.       {
  95.         if(ai->xai_Flags & XADAIF_CRYPTED)
  96.           xdi->xdi_Flags |= XADDIF_CRYPTED;
  97.         xdi->xdi_Flags |= XADDIF_NOCYLINDERS|XADDIF_NOLOWCYL|
  98.                       XADDIF_NOHIGHCYL|XADDIF_NOHEADS|XADDIF_NOCYLSECTORS;
  99.         xdi->xdi_TotalSectors = h.pd_BlockNum;
  100.         xdi->xdi_SectorSize = h.pd_BlockSize;
  101.         xdi->xdi_TrackSectors = h.pd_TrackLength / h.pd_BlockSize;
  102.         xdi->xdi_EntryNumber = 1;
  103.         xdi->xdi_PrivateInfo = (APTR) h.pd_xpkPacker;
  104.         ai->xai_DiskInfo = xdi;
  105.  
  106.     /* does nothing if blksiz == 0 */
  107.     for(i = 0; i < blksiz; ++i)
  108.         {
  109.           if(i < h.pd_Reserved || (buf[i/8] & ((1 << (7-(i%8))))))
  110.             xdi->xdi_BlockInfo[i] |= XADBIF_CLEARED;
  111.         }
  112.       }
  113.       else
  114.         err = XADERR_NOMEMORY;
  115.     }
  116.     if(buf)
  117.       FreeVec(buf);
  118.   }
  119.  
  120.   return err;
  121. }
  122.  
  123. /* still missing */
  124. ASM(LONG) PackDev_UnArchive(REG(a0, struct xadArchiveInfo *ai),
  125. REG(a6, struct xadMasterBase *xadMasterBase))
  126. {
  127.   return XADERR_INPUT;
  128. }
  129.  
  130. ASM(void) PackDev_Free(REG(a0, struct xadArchiveInfo *ai),
  131. REG(a6, struct xadMasterBase *xadMasterBase))
  132. {
  133.   if(ai->xai_DiskInfo)
  134.   {
  135.     xadFreeObjectA(ai->xai_DiskInfo, 0);
  136.     ai->xai_DiskInfo = 0; /* clear the entry */
  137.   }
  138. }
  139.  
  140. struct xadClient PackDev_Client = {
  141. NEXTCLIENT, XADCLIENT_VERSION, 1, PACKDEV_VERSION, PACKDEV_REVISION,
  142. 4, XADCF_DISKARCHIVER, 0/*XADCID_PACKDEV*/, "PackDev",
  143. (BOOL (*)()) PackDev_RecogData, (LONG (*)()) PackDev_GetInfo,
  144. (LONG (*)()) PackDev_UnArchive, (void (*)()) PackDev_Free};
  145.  
  146. #endif /* XADASTER_PACKDEV_C */
  147.